Ana içeriğe geç

Örnekler

ERTP ve Zoe ile ilgili birkaç örnek verelim.

Örnek 1

Bir dijital varlık transferi yapmak için, kullanıcının Agoric cüzdanında bir ödeme yapması gerekiyor. Bu ödeme, ERTP protokolü aracılığıyla gerçekleştirilir ve Zoe tarafından yönetilir.

import harden from "@agoric/harden";
import { E } from "@agoric/eventual-send";

// Önce ERTP ve Zoe'yi yükleyelim.
import { makeZoe } from "@agoric/zoe";
import { setup } from "@agoric/swingset-vat";
import { makeLocalAmountMath } from "@agoric/ertp";

const start = async () => {
// Swingset'i kurarak Agoric platformunu başlatalım.
const { zoeInvite: inviteIssuer, feePurse } = await setup();

// ERTP ile ilgili bilgileri alalım.
const { amountMath: moolaAmountMath, moolaIssuer } = makeLocalAmountMath("moola");
const { amountMath: simoleanAmountMath, simoleanIssuer } = makeLocalAmountMath("simolean");

// Zoe'yi oluşturalım.
const zoe = await makeZoe({ require });

// Bir teklif için bir ödeme yapalım.
const payment = moolaAmountMath.make(10);

// Teklife katılacaklar için bir davetiye oluşturalım.
const invitePurse = E(feePurse).withdrawAll();
const zoeInviteIssuer = await E(zoe.getInvitationIssuer).call();
const zoeInvitePayment = await E(zoeInviteIssuer).claim(invitePurse);

// TEKLİF OLUŞTURMA
const terms = harden({
offerRules: [
{
want: { Asset: moolaAmountMath.make(10) },
give: { Price: simoleanAmountMath.make(20) }
}
],
payoutRules: [
{
kind: "want",
asset: moolaIssuer,
amount: moolaAmountMath.make(10)
},
{
kind: "give",
asset: simoleanIssuer,
amount: simoleanAmountMath.make(20)
}
]
});

const { seat, payout } = await E(zoe).offer(zoeInvitePayment, terms);

// Ödeme yaparak dijital varlık transferi gerçekleştirdik.
console.log("Dijital varlık transferi tamamlandı!");
};

start();

Bu örnekte, makeZoe() fonksiyonu ile Zoe oluşturulur ve makeLocalAmountMath() ile ERTP bilgileri alınır. Sonra, bir ödeme yapılır ve bir teklif için bir davetiye oluşturulur. Ardından offer() fonksiyonu kullanılarak teklif oluşturulur ve bu teklif kabul edildiğinde, seat ve payout nesneleri elde edilir.

Ödeme yaparak dijital varlık transferi gerçekleştirmek için, burada teklifin kabul edilmesi gerekiyor. Teklif kabul edildiğinde, verilen ödeme için dijital varlıkların transferi gerçekleştirilir ve bu transfer ERTP protokolü aracılığıyla gerçekleştirilir. Sonuç olarak, console.log() fonksiyonu ile "Dijital varlık transferi tamamlandı!" yazısı konsol ekranına yazdırılır.

Örnek 2

Bir akıllı sözleşme yazmak istiyorsanız, Zoe'nin belirli parametrelerine uygun olmalıdır. Örneğin, sözleşmeniz, ERTP protokolünü kullanarak dijital varlıkların transferini gerçekleştirmeli ve bu varlıkları hangi koşullar altında kabul edeceğinizi belirtmelisiniz.

import harden from '@agoric/harden';
import { makeZoe } from '@agoric/zoe';
import { E } from '@agoric/eventual-send';

const myContract = harden(zcf => {

const sellSeat = zcf.makeEmptySeatKit();
const buySeat = zcf.makeEmptySeatKit();

let price;

// Sell side of the contract
const sellOfferHook = async offerHandle => {
const offerP = sellSeat.hasOffer(offerHandle);
const offer = await E.when(offerP);
price = offer.proposal.give.amount;
const buyInvitation = await buySeat.spawn(
harden({
give: { Amount: offer.proposal.want },
want: { Price: price }
})
);
return `The seller will sell ${offer.proposal.give.Amount} for ${price}. To accept this offer, please use the following invitation: ${buyInvitation}`;
};

// Buy side of the contract
const buyOfferHook = async offerHandle => {
const offerP = buySeat.hasOffer(offerHandle);
const offer = await E.when(offerP);
if (offer.proposal.give.Amount >= price) {
sellSeat.exit();
buySeat.exit();
return `Transaction completed. You have purchased ${offer.proposal.give.Amount} for ${price}.`;
} else {
return `Transaction failed. The requested amount is less than the agreed upon price.`;
}
};

return harden({
invite: zcf.makeInvitation(sellOfferHook, 'sell'),
publicAPI: {
getBuyInvitation: () => buySeat.getOfferStatuses().allocated[0].invitationDetails,
getSellAmount: () => sellSeat.getCurrentAllocation().give.Amount,
getPrice: () => price
}
});
});

const start = async () => {
const zoe = makeZoe();
const inviteIssuer = zoe.getInviteIssuer();
const { seat: sellSeat, invitation: sellInvitation } =
await zoe.startInstance(myContract, { inviteIssuer });
const buyInvitationDetails = await E(myContract.publicAPI).getBuyInvitation();
const { seat: buySeat } =
await zoe.offer(inviteIssuer.claim(buyInvitationDetails));
};

Bu örnek, bir kripto para birimi alım satım işlemi yapmak için kullanılabilir. Satıcı, sellOfferHook fonksiyonunu kullanarak kripto para birimini satışa çıkarır ve ne kadarlık kripto para birimi satacağını belirtir. Alıcı, buyOfferHook fonksiyonunu kullanarak satıcının teklifine yanıt verir ve istenilen kripto para birimi miktarını belirtir. İşlem gerçekleştikten sonra, akıllı sözleşme otomatik olarak ödeme ve varlık transferlerini tamamlar.

Örnek 3:

Akıllı sözleşmelerin yürütülmesi sırasında, Zoe işlemleri doğrular ve geçerliliğini kontrol eder. Bu sayede, hatalı veya sahte işlemlerin gerçekleşmesi engellenir.

import harden from '@agoric/harden';
import { makeZoe } from '@agoric/zoe';
import { E } from '@agoric/eventual-send';

const myContract = harden(zcf => {

const sellSeat = zcf.makeEmptySeatKit();
const buySeat = zcf.makeEmptySeatKit();

let price;

// Sell side of the contract
const sellOfferHook = async offerHandle => {
const offerP = sellSeat.hasOffer(offerHandle);
const offer = await E.when(offerP);
price = offer.proposal.give.amount;
const buyInvitation = await buySeat.spawn(
harden({
give: { Amount: offer.proposal.want },
want: { Price: price }
})
);
return `The seller will sell ${offer.proposal.give.Amount} for ${price}. To accept this offer, please use the following invitation: ${buyInvitation}`;
};

// Buy side of the contract
const buyOfferHook = async offerHandle => {
const offerP = buySeat.hasOffer(offerHandle);
const offer = await E.when(offerP);
if (offer.proposal.give.Amount >= price) {
sellSeat.exit();
buySeat.exit();
return `Transaction completed. You have purchased ${offer.proposal.give.Amount} for ${price}.`;
} else {
return `Transaction failed. The requested amount is less than the agreed upon price.`;
}
};

const myZCFMint = zcf.getTerms().brands.Amount;

const sellPred = seat => {
return myZCFMint.isGTE(
seat.getCurrentAllocation().give.Amount,
harden(price),
);
};

const buyPred = seat => {
return true;
};

const sellPayments = { Asset: sellSeat.getCurrentAllocation().give.Asset };
const buyPayments = { Price: buySeat.getCurrentAllocation().want.Price };

return zcf.makeInvitation((buyerSeat, offer) => {
const sellerOfferResult = sellSeat.tryExit();
if (sellerOfferResult) {
const offerHandle = sellerOfferResult.exitObj;
const check = E(zcf).checkOffer(
offerHandle,
sellPred,
sellPayments,
);
if (!check) {
throw new Error(`Invalid Offer`);
}
return E(buyerSeat).offer(
offer,
buyOfferHook,
buyPred,
buyPayments,
);
} else {
return `Seller has already sold the asset or cancelled the offer.`;
}
}, 'buy');
});

const start = async () => {
const zoe = makeZoe();
const inviteIssuer = zoe.getInviteIssuer();
const { seat: sellSeat, invitation: sellInvitation } =
await zoe.startInstance(myContract, { inviteIssuer });
const buyInvitationDetails = await E(zoe).getInvitationDetails(sellInvitation);
const { seat: buySeat } =
await zoe.offer(inviteIssuer.claim(buyInvitationDetails));
};

Bu örnekte, Zoe, checkOffer işlevini kullanarak satıcıya verilen teklifin geçerli olup olmadığını kontrol eder. Bu işlem, satıcının sunduğu varlıkların gereksinimleri karşıladığını ve fiyatın doğru olduğunu onaylar.

İşlemin doğruluğu kontrol edildikten sonra, alıcıya bir davet gönderilir ve işlem tamamlanır. Alıcı, ilgili miktarı öder ve satıcının belirttiği varlığı alır.

Sonuç olarak, ERTP ve Zoe Introduction, Agoric platformunun temel bileşenleri arasındadır ve dijital varlık transferinin güvenli bir şekilde yapılmasını sağlar. Bu mekanizmaların kullanımı, akıllı sözleşmelerin geliştirilmesi ve yürütülmesi sürecinde önemlidir.